#include "frame_task_queue.h"

int taskQueueInit(taskQueue_t *pTaskQueue) {
	memset(pTaskQueue, 0, sizeof(taskQueue_t));
	return 0;
}

void taskQueueFree(taskQueue_t *pTaskQueue) {
	if (pTaskQueue == NULL) {
		return;  // 防止空指针解引用
	}

	// 遍历链表释放所有节点
	queue_node_t *current = pTaskQueue->front;
	while (current != NULL) {
		queue_node_t *temp = current;  // 保存当前节点
		current = current->next;      // 移动到下一个节点
		close(temp->netfd);           // 关闭文件描述符
		free(temp);                   // 释放当前节点
	}

	// 重置队列状态
	pTaskQueue->front = NULL;
	pTaskQueue->rear = NULL;
	pTaskQueue->size = 0;
}

int enQueue(taskQueue_t *pTaskQueue, int netfd) {
	queue_node_t *pNew = (queue_node_t*)calloc(1, sizeof(queue_node_t));
	pNew->netfd = netfd;

	if (pTaskQueue->size == 0) {
		pTaskQueue->front = pNew;
		pTaskQueue->rear = pNew;
	} else {
		pTaskQueue->rear->next = pNew;
		pTaskQueue->rear = pNew;
	}

	pTaskQueue->size++;

	return 0;
}

int deQueue(taskQueue_t *pTaskQueue, int *pNetfd) {
	if (pTaskQueue->size == 0) {
		return -1;
	}

	queue_node_t *pCur = pTaskQueue->front;
	*pNetfd = pCur->netfd;
	pTaskQueue->front = pCur->next;

	if (pTaskQueue->size == 1) {
		pTaskQueue->rear = NULL;
	}

	free(pCur);
	pTaskQueue->size--;

	return 0;
}
